package model;

import java.util.ArrayList;

/**
 * Modelagem das Notas de um Aluno.
 * @author Adriano
 */
public class Notas {

    Aluno aluno;
    Disciplina disciplina;
    ArrayList<Double> notas;
    double media;
    String status;
    String semestre;

    public Notas(Aluno aluno, Disciplina disciplina, ArrayList<Double> notas, double media, String status, String semestre) {
        this.aluno      = aluno;
        this.disciplina = disciplina;
        this.notas      = notas;
        this.media      = media;
        this.status     = status;
        this.semestre   = semestre;
    }

    public Notas(Aluno aluno, Disciplina disciplina) {
        this.aluno = aluno;
        this.disciplina = disciplina;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public double getMedia() {
        return media;
    }

    public void setMedia(double media) {
        this.media = media;
    }

    public ArrayList<Double> getNotas() {
        return notas;
    }

    public void setNotas(ArrayList<Double> notas) {
        this.notas = notas;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getSemestre() {
        return semestre;
    }

    public void setSemestre(String semestre) {
        this.semestre = semestre;
    }

    
    /**
     * Calcula a média aritmética das notas presentes no ArrayList<Double>
     * passado como parâmetro.
     * @param notas Notas do aluno na referida disciplina
     * @return Média das notas presentes no ArrayList
     */
    public void calcularMedia() { // se errar os cálculos, retorna -1

        int    tamanho        = notas.size();
        double mediaParcial   = 0;

        if (notas.isEmpty()) {
            this.media = -1;
        }
        else if (tamanho == 4) { // tem prova final
            for (int i = 0; i < 3; i++) {
                mediaParcial += this.notas.get(i);
            }
            this.media = (((6 * mediaParcial / 3) + (4 * this.notas.get(3))) / 10);
        }
        else { //atualiza média, registra médias parciais
            for (int i = 0; i < tamanho; i++) {
                mediaParcial += this.notas.get(i);
            }
            this.media = mediaParcial / tamanho;
        }
    }

    /**
     * Atualiza o status do objeto Notas de acordo com as notas do aluno
     * na disciplina.
     */
    public void atualizaStatus() {

        int quantidadeDeNotas = this.notas.size();

        // ainda em curso
        if (quantidadeDeNotas < 3) {
            this.setStatus("EM CURSO");
        }
        // reprovado por média
        else if ((quantidadeDeNotas == 3) && (this.media < 4.0)) {
            this.setStatus("REPROVADO");
        }
        // aprovado por média
        else if ((quantidadeDeNotas == 3) && (this.media == 7.0)) {
            this.setStatus("APROVADO");
        }
        // em curso, vai fazer prova final
        else if((quantidadeDeNotas == 3) && ((this.media > 4.0) && (this.media < 7.0))) {
            this.setStatus("EM CURSO");
        }
        // reprovado na prova final
        else if((quantidadeDeNotas == 4) && (this.media < 5.0)) {
            this.setStatus("REPROVADO");
        }
        // aprovado na prova final
        else {
            this.setStatus("APROVADO");
        }
    }
}
